今天的內容又又又再次圍繞在反向代理與 odoo 設定的效能改善與安全強化,包括透過 X-Sendfile 和 X-Accel 來處理 odoo 附件的傳輸,並且介紹了三個常見的 nginx 設定:HSTS、Cookie 安全標記與 Gzip 壓縮。
在 odoo 中,附件是儲存在 filestore 中的檔案,通常是圖片、PDF 或其他大型檔案。如果將這些附件放在資料庫中,會造成資料庫負擔過重,增加儲存空間需求,並可能導致資料庫鎖定問題,降低資料庫的效能;將附件存放在檔案系統中,有助於減少資料庫的負擔,同時提升檔案的讀寫效率。此外,這種方式簡化了附件的管理,如版本控制和備份。
最後一個優勢是,odoo 將附件儲存在檔案系統中,允許像 NGINX 這樣的靜態伺服器使用 X-Accel 這類委派檔案服務來處理檔案傳輸,進一步減少 odoo 伺服器的負擔。
附件的存取權限由 odoo 嚴格控制,確保只有授權的使用者才能訪問相關檔案。因為附件的存取需要多次資料庫查詢,以確定檔案的存放位置和當前使用者的存取權限,所以這些檔案無法直接透過靜態網路伺服器訪問。為了解決這個問題,當使用者提出需求後,odoo 會驗證權限並找到檔案的位置,然後告訴 NGINX 要去哪裡找到檔案,再由 NGINX 從檔案系統中找到檔案傳送給使用者。
odoo.conf
首先,確定我們的 data_dir
有指定資料目錄(如果不設定的話,預設會設在 ~/.local/share/odoo
):
data_dir = /var/lib/odoo
設置 x-sendfile
選項為 True
:
# x-sendfile:
# Enable X-Sendfile support to delegate file serving to a web server like NGINX.
x-sendfile = True
要再次確認 filestore 的路徑,可以啟動 odoo,然後直接訪問 /web/filestore
URL,odoo 將會記錄相關的警告訊息,我們就可以檢查到它的位置。
2024-10-10 17:27:24 FileNotFoundError: [Errno 2] No such file or directory: '/var/lib/odoo/filestore/odoo/23/23fe89f51c8121f053a697a3dd79106f25aeeb52'
確定 odoo 容器有掛載 volume 到我們的 data_dir
位置:
- odoo-dev-data:/var/lib/odoo # Persistent volume for data and attachments
在 reverse-proxy 容器也掛上這個 volume,並且設定成 readonly:
# Mount odoo filestore for attachments (for serving attachments via X-Accel)
- odoo-dev-data:/opt/odoo-dev/filestore:ro
在 NGINX nginx_odoo.conf
的 odoo-dev
server block 中,添加以下設定透過 X-Accel 服務附件:
# Serve attachments via X-Accel after odoo verifies access
location /web/filestore {
internal;
alias /opt/odoo-dev/filestore;
}
在 nginx_odoo.conf
中
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
HSTS(HTTP Strict Transport Security) 是一種安全功能,強制瀏覽器在訪問網站時只能使用 HTTPS,而不允許降級為不安全的 HTTP。透過設定 Strict-Transport-Security
標頭,可以告訴瀏覽器未來一段時間內(由 max-age
指定)都應該僅透過 HTTPS 訪問該網站。
在 nginx_odoo.conf
中
proxy_cookie_flags session_id samesite=lax secure; # requires nginx 1.19.8
此設定用來強化 Cookie 的安全性,防止跨站請求偽造(CSRF)攻擊和不安全的 Cookie 傳輸。samesite
和 secure
是兩個重要的 Cookie 標記:
secure
時,瀏覽器僅會在使用 HTTPS 加密的情況下發送 Cookie,防止 Cookie 在不安全的 HTTP 請求中被竊取。這個設定尤其適用於處理用戶身份驗證的 Cookie(例如 session_id
),能顯著提升網站的安全性。
在 nginx.conf
中
gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript;
gzip on;
Gzip 壓縮是一種常見的效能優化技術,用來減少傳輸的數據量,從而加快網站的載入速度。透過啟用 Gzip,NGINX 可以壓縮指定類型的檔案,讓這些檔案在傳輸過程中佔用更少的頻寬,提升網頁的載入速度,改善使用者體驗。
text/css
:樣式表文件text/scss
:Sass 样式表text/plain
:純文字文件application/json
:JSON 文件application/javascript
:JavaScript 文件透過設定 X-Sendfile 或 X-Accel,我們可以在確保安全性的前提下,提升附件服務的效率。不過,這個設定完成後,我一直找不到方法驗證是否有成功,我在 odoo 中進行各種操作,但從日誌中沒看到相關的線索,可能需要等到自己寫一個模組,知道哪個部分會用到這個功能再回來驗證。
另外三個設定,則可以從瀏覽器的開發者選項觀察到:
終於是...把反向代理搞定了...吧